home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / grafik / 3d & render tools / irit / contrib / scripts / indycam.irt < prev    next >
Encoding:
Text File  |  1996-07-16  |  11.3 KB  |  270 lines

  1. #---------------------------------------------------------------------------
  2. # iritstate("EchoSource", FALSE);
  3. iritstate("InterCrv", FALSE);
  4. RESOLUTION = 20;
  5. BODY_WIDTH = 13.6;
  6. COLUMN_WIDTH = 1;
  7. BASE_WIDTH = BODY_WIDTH + 2 * 0.2 + 2 * COLUMN_WIDTH + 2 * 0.1;
  8. BASE = -3.6;
  9. EPS = 0.0001;
  10. #---------------------------------------------------------------------------
  11. roundRect = function(xMin, xMax, yMin, yMax, radius): curve :
  12.   curve =   arc(vector(xMin,          yMax - radius, 0),
  13.             vector(xMin + radius, yMax - radius, 0),
  14.             vector(xMin + radius, yMax,          0)) +
  15.         arc(vector(xMax - radius, yMax,          0),
  16.         vector(xMax - radius, yMax - radius, 0),
  17.         vector(xMax,          yMax - radius, 0)) +
  18.         arc(vector(xMax,          yMin + radius, 0),
  19.                 vector(xMax - radius, yMin + radius, 0),
  20.         vector(xMax - radius, yMin,         0)) +
  21.         arc(vector(xMin + radius, yMin,         0),
  22.         vector(xMin + radius, yMin + radius, 0),
  23.         vector(xMin,          yMin + radius, 0)):
  24.   if(yMax - radius == yMin + radius,
  25.     return = curve, return = curve + ctlpt(E2, xMin, yMax-radius));
  26. #---------------------------------------------------------------------------
  27. makePoly = function(closedCurve):
  28.   return = gpolygon(boolone(closedCurve), off);
  29. #---------------------------------------------------------------------------
  30. continue = function(curve, length): pt : cpt : tMax :
  31.     tMax = nth(pdomain(curve), 2):
  32.     cPt = ceval(curve, tMax):
  33.     pt = vector(coord(cPt, 1), coord(cPt, 2), coord(cPt, 3)):
  34.     return = pt + ctangent(curve, tMax) * length;
  35. #---------------------------------------------------------------------------
  36. makeBody = function(final): side : cut : sideProfile : middleProfile :
  37.   middleProfile = roundRect(-2, 4, -2, 2, 2):
  38.   sideProfile   = roundRect(-2, 3, -2, 2, 2):
  39.   return = sfromcrvs(list(sideProfile   * trans(vector(0, 0,  BODY_WIDTH/2)),
  40.                       middleProfile * trans(vector(0, 0,  BODY_WIDTH/4)),
  41.                       middleProfile,
  42.                       middleProfile * trans(vector(0, 0, -BODY_WIDTH/4)),
  43.                           sideProfile   * trans(vector(0, 0, -BODY_WIDTH/2))),
  44.             4):
  45.   if(final == TRUE, 
  46.      cut = roundRect(2, 6, -2, 2, 1) * rotx(90) * trans(vector(0, -3, 0)):
  47.      cut = extrude(cut, vector(0, 6, 0)):
  48.      return = return - cut:
  49.      side = makePoly(sideProfile):
  50.      return = mergepoly(list(return,
  51.                           -side * trans(vector(0, 0,  BODY_WIDTH/2 )),
  52.                           side * trans(vector(0, 0, -BODY_WIDTH/2 )))):
  53.      color(return, GREEN), return);
  54.  
  55. #---------------------------------------------------------------------------
  56. makeCap = function(): body :
  57.   body = makeBody(FALSE):
  58.   return = roundRect(1.25, 6.25, -2.5, 2.5, 1)
  59.        * rotx(90) * trans(vector(0.5, -4, 0)):
  60.   return = extrude(return, vector(-1, 8, 0)):
  61.   return = return * -body:
  62.   body = offset(body, -0.1, 0.1, off):
  63.   return = body * return:
  64.   color(return, RED);
  65. #---------------------------------------------------------------------------
  66. makeBase = function(): middleProfile : coeff : sideProfile : pt1 : pt2 :
  67.   pt3 : pt4 : pt5 : pt6 : pt7 : c :
  68.   pt1 = ctlpt(E3, 0,   0.5,  0):
  69.   pt2 = ctlpt(E3, 0,   0.7,  0):
  70.   pt3 = ctlpt(E3, 0.2, 0.75, 0):
  71.   c = ctlpt(E3, 0, 0, 0) + cbezier(list(pt1, pt2, pt3)):
  72.   pt4 = continue(c, 2.5):
  73.   pt5 = ctlpt(E3, 5, 0.15, 0):
  74.   c = c + cbezier(list(pt3, pt4, pt5)):
  75.   pt6 = continue(c, 0.1):
  76.   pt7 = ctlpt(E3, 5.1, 0, 0):
  77.  
  78.   sideProfile = c + cbezier(list(pt5, pt6, pt7)) + ctlpt(E3, 0, 0, 0):
  79.   coeff = 5.7/5:
  80.   middleProfile = sideProfile * scale(vector(coeff, coeff, coeff)):
  81.  
  82.   return = sfromcrvs(list(sideProfile   * trans(vector(0, 0,  BASE_WIDTH/2)),
  83.                        middleProfile * trans(vector(0, 0,  BASE_WIDTH/4)),
  84.                        middleProfile,
  85.                        middleProfile * trans(vector(0, 0, -BASE_WIDTH/4)),
  86.                        sideProfile   * trans(vector(0, 0, -BASE_WIDTH/2))),
  87.              4):
  88.   return = return * trans(vector(-2.3, BASE, 0));
  89. #---------------------------------------------------------------------------
  90. makeColumn = function(): x : y : a : b : c : pX : pY : radius : profile :
  91. # |(x, y)| = r
  92. # ((p - (x, y)) * (x, y) = 0
  93.   pX = 2.25:
  94.   pY = BASE + 0.1:
  95.   radius = 1.9:
  96.   a = sqr(pX) + sqr(pY):
  97.   b = -2 * sqr(radius) * pX:
  98.   c = sqr(sqr(radius)) - sqr(pY) * sqr(radius):
  99.   x = (-b + sqrt(sqr(b) - 4 * a * c)) / (2 * a):
  100.   y = sqrt(sqr(radius) - sqr(x)):
  101.   profile = ctlpt(E2,  pX, pY) +
  102.             arc(vector( x, y, 0),
  103.             vector( 0, 0, 0),
  104.             vector(-x, y, 0)) +
  105.             ctlpt(E2, -pX, pY) + 
  106.             ctlpt(E2,  pX, pY):
  107.   return = extrude(profile, vector(0, 0, 1)):
  108.   profile = makePoly(profile):
  109.   return = mergepoly(list(-profile,
  110.                        profile * trans(vector(0, 0, COLUMN_WIDTH)),
  111.                        gpolygon(return, off))):
  112.   return = return * trans(vector(0, 0, BODY_WIDTH/2 + 0.2));
  113. #---------------------------------------------------------------------------
  114. makeSide = function(): radius : cos25 : sin25 :
  115.   sin25 = sin(25 * PI / 180):
  116.   cos25 = cos(25 * PI / 180):
  117.   radius = (BASE_WIDTH - 0.2) / 2:
  118.   return = arc(vector(-radius * sin25, BASE - 0.1, radius * cos25),
  119.            vector( 0,              BASE - 0.1, 0),
  120.            vector( radius * sin25, BASE - 0.1, radius * cos25)):
  121.   return = extrude(return, vector(0, 5.7, -0.4));
  122. #---------------------------------------------------------------------------
  123. makeSupport = function(): side : column : base :
  124.   column = makeColumn():
  125.   side = makeSide():
  126.   base = makeBase():
  127.   return = (base + column) * side:
  128.   column = column * roty(180):
  129.   side = side * roty(180):
  130.   return = (return + column) * side:
  131.   color(return, MAGENTA);
  132. #---------------------------------------------------------------------------
  133. makeLeg = function(): leg : profile :
  134.   profile = ctlpt(E1,  2) + 
  135.             arc(vector( 2,   0, 0.8),
  136.                 vector( 1.4, 0, 0.8),
  137.                 vector( 1.4, 0, 1.4)) +
  138.             arc(vector(-1.4, 0, 1.4),
  139.                 vector(-1.4, 0, 0.8),
  140.                 vector(-2,   0, 0.8)) +
  141.             ctlpt(E1, -2) + ctlpt(E1, 2):
  142.    profile = profile * trans(vector(0, BASE + 0.2, BODY_WIDTH / 2 - 0.8)):
  143.    leg = extrude(profile, vector(0, -0.4, 0)):
  144.    profile = makePoly(profile):
  145.    leg = leg ^ (profile * trans(vector(0, -0.4, 0))):
  146.    return = list(leg, leg * roty(180)):
  147.    color(return, WHITE);
  148. #---------------------------------------------------------------------------
  149. makeStopper = function(): stopper :
  150.   stopper = box(vector(-0.8, -1.5, 2.6), 1.6, -1.5, 0.2):
  151.   return = list(stopper, stopper * roty(180)):
  152.   color(return, YELLOW);  
  153. #---------------------------------------------------------------------------
  154. makeSpindel = function(): spindel :
  155.   spindel = extrude(circle(vector(0, 0, BODY_WIDTH / 2 - 0.1), 1.5),
  156.             vector(0, 0, 0.4)):
  157.   return = list(spindel, spindel * roty(180)):
  158.   color(return, YELLOW);
  159. #---------------------------------------------------------------------------
  160. makeTube = function():
  161.  return = surfrev(ctlpt(E3, 0, EPS,  0) +
  162.               ctlpt(E3, 0, 0.5,  0) +
  163.               ctlpt(E3, 0, 0.5,  1) +
  164.               ctlpt(E3, 0, 0.8,  1) +
  165.               ctlpt(E3, 0, 0.8,  1.3) +
  166.               ctlpt(E3, 0, 0.9,  1.3) +
  167.               ctlpt(E3, 0, 0.9,  1.75) +
  168.               ctlpt(E3, 0, 0.85, 1.8) +
  169.                   ctlpt(E3, 0, EPS,  1.8)) * roty(90) * trans(vector(1.6,0,0)):
  170.   color(return, BLUE);
  171. #---------------------------------------------------------------------------
  172. makeTail = function():
  173.   return = list(
  174.     con2(vector(-1.5, 0, 0), vector(-1, 0, 0), 0.5, 0.4),
  175.     sweepsrf(circle(vector(0, 0, 0), 0.2),
  176.              ctlpt(E1, -2) + cbezier(list(ctlpt(E2, -3,  0),
  177.                                           ctlpt(E2, -5,  0),
  178.                                           ctlpt(E2, -5, BASE + 0.2),
  179.                                           ctlpt(E2, -7, BASE + 0.2))), off)):
  180.   color(return, CYAN);
  181. #---------------------------------------------------------------------------
  182. makeHolder = function(): curve : profile : holder : tran1 :
  183.   curve = arc(vector(0, 0, 0.4),
  184.               vector(0, 0, 0),
  185.               vector(0, 0.4 * sin(120 * PI / 180), 0.4 * cos(120 * PI / 180))):
  186.   profile = ctlpt(E2,  0.1,  0.15) + 
  187.             ctlpt(E2, -0.1,  0.15) +
  188.             ctlpt(E2, -0.1, -0.15) +
  189.             ctlpt(E2,  0.1, -0.15) +
  190.             ctlpt(E2,  0.1,  0.15):
  191.   holder = sweepsrf(profile, curve, off):
  192.   holder = holder ^ makePoly(csurface(holder, ROW, 1)):
  193.   return = list(holder,
  194.                 holder * rotz(180) * trans(vector( 0.35, 0, 0)),
  195.         holder * rotz(180) * trans(vector(-0.35, 0, 0))):
  196.   return = return * trans(vector(0, BASE + 0.6, -BASE_WIDTH / 2 - 0.1));
  197. #---------------------------------------------------------------------------
  198. makeMicro = function():
  199.  return = surfrev(ctlpt(E3, 0, EPS,  -1.4) +
  200.               ctlpt(E3, 0, 0.15, -1.4) +
  201.               ctlpt(E3, 0, 0.2,  -0.6) +
  202.               ctlpt(E3, 0, 0.3,  -0.6) +
  203.               ctlpt(E3, 0, 0.3,   0.5) +
  204.               ctlpt(E3, 0, 0.35,  0.6) +
  205.               ctlpt(E3, 0, 0.35,  1.4) +
  206.               ctlpt(E3, 0, EPS,   1.4)) * roty(90) *
  207.                     trans(vector(0, BASE + 0.6, -BASE_WIDTH / 2 - 0.1)): 
  208.   color(return, BLUE);
  209. #---------------------------------------------------------------------------
  210. makeWire = function():
  211.   return = sweepsrf(circle(vector(0, 0, 0), 0.1),
  212.              ctlpt(E1, -1) + 
  213.              cbezier(list(ctlpt(E2, -1.4, 0),
  214.                           ctlpt(E2, -3, 0),
  215.                           ctlpt(E2, -5, -0.5),
  216.                           ctlpt(E2, -7, -0.5))), off):
  217.   return = return * trans(vector(0, BASE + 0.6, -BASE_WIDTH / 2 - 0.1)): 
  218.   color(return, CYAN);
  219. #---------------------------------------------------------------------------
  220. makeView = function():
  221.   return = roty(-130) * scale(vector(0.1, 0.1, 0.1)) * rotx(25);
  222. #---------------------------------------------------------------------------
  223. makeBack = function():
  224.   return = poly(list(vector(-BASE_WIDTH,  3 * BASE_WIDTH,  3 * BASE_WIDTH),
  225.              vector(-BASE_WIDTH,  3 * BASE_WIDTH, -3 * BASE_WIDTH),
  226.              vector(-BASE_WIDTH, -3 * BASE_WIDTH, -3 * BASE_WIDTH),
  227.              vector(-BASE_WIDTH, -3 * BASE_WIDTH,  3 * BASE_WIDTH)),
  228.              FALSE):
  229.   attrib(return, "rgb", "64,0,0");
  230. #---------------------------------------------------------------------------
  231. moveCap = function(cap, n): alpha : t : p : middleT : endT : path :
  232.   domain : body :
  233.   body = makeBody(FALSE):
  234.   domain = pdomain(body):
  235.   path = csurface(body, COL, (nth(domain, 1) + nth(domain, 2)) / 2):
  236.   domain = pdomain(path):
  237.   endT = nth(domain, 2):
  238.   middleT = (nth(domain, 1) + endT) / 2:
  239.   p = ceval(path, middleT):
  240.   return = cap * trans(-vector(coord(p, 1), coord(p, 2), coord(p, 3))):
  241.   t = (100 - n) * middleT / 100 + n * endT/ 100:
  242.   alpha = acos(ctangent(path, t) * ctangent(path, middleT)) * 180 / PI:
  243.   return = return * roty(alpha):
  244.   p = ceval(path, t):
  245.   return = return * trans(vector(coord(p, 1), coord(p, 2), coord(p, 3)));
  246. #---------------------------------------------------------------------------
  247. iritstate("EchoSource", TRUE);
  248. #---------------------------------------------------------------------------
  249. view_mat = makeView();
  250. dark = list(makeTube(), makeMicro());
  251. camera = list(
  252.   makeBody(TRUE),
  253.   makeSupport(),
  254.   moveCap(makeCap(), 75),
  255.   makeLeg(),
  256.   makeStopper(),
  257.   makeSpindel(),
  258.   makeTail(),
  259.   makeHolder(),
  260.   makeWire(),
  261.   dark,
  262.   view_mat);
  263. view(camera, TRUE);
  264. attrib(camera, "rgb", "128,128,128");
  265. attrib(dark, "rgb", "32,32,32");
  266. snoc(makeBack(), camera);
  267. #save("/tmp/camera.dat", camera);
  268.  
  269.  
  270.